#include <string.h>
#include <gmodule.h>
+#include <gio/gio.h>
#include "gtkbuilderprivate.h"
#include "gtkbuilder.h"
#include "gtkbuildable.h"
return TRUE;
}
+static gboolean
+parse_menu (GMarkupParseContext *context,
+ const gchar *element_name,
+ const gchar **names,
+ const gchar **values,
+ gpointer user_data,
+ GError **error)
+{
+ gchar *id;
+ ParserData *data = user_data;
+ ObjectInfo *object_info;
+
+ if (!g_markup_collect_attributes (element_name, names, values, error,
+ G_MARKUP_COLLECT_STRING, "id", &id,
+ G_MARKUP_COLLECT_INVALID))
+ return FALSE;
+
+ object_info = g_slice_new0 (ObjectInfo);
+ object_info->class_name = g_strdup ("GMenu");
+ object_info->id = g_strdup (id);
+ object_info->tag.name = element_name;
+ state_push (data, object_info);
+
+ g_menu_markup_parser_start_menu (context, NULL);
+
+ return TRUE;
+}
+
static void
start_element (GMarkupParseContext *context,
const gchar *element_name,
parse_signal (data, element_name, names, values, error);
else if (strcmp (element_name, "interface") == 0)
parse_interface (data, element_name, names, values, error);
+ else if (strcmp (element_name, "menu") == 0)
+ parse_menu (context, element_name, names, values, data, error);
else if (strcmp (element_name, "placeholder") == 0)
{
/* placeholder has no special treatmeant, but it needs an
else if (strcmp (element_name, "interface") == 0)
{
}
+ else if (strcmp (element_name, "menu") == 0)
+ {
+ ObjectInfo *object_info;
+ GObject *menu;
+
+ object_info = state_pop_info (data, ObjectInfo);
+ menu = (GObject*)g_menu_markup_parser_end_menu (context);
+ _gtk_builder_add_object (data->builder, object_info->id, menu);
+ g_object_unref (menu);
+
+ free_object_info (object_info);
+ }
else if (data->requested_objects && !data->inside_requested_object)
{
/* If outside a requested object, simply ignore this tag */
g_object_unref (builder);
}
+static void
+test_gmenu (void)
+{
+ GtkBuilder *builder;
+ GError *error;
+ GObject *obj, *obj1;
+ const gchar buffer[] =
+ "<interface>"
+ " <object class=\"GtkWindow\" id=\"window\">"
+ " </object>"
+ " <menu id='edit-menu'>"
+ " <section>"
+ " <item label='Undo' action='undo'/>"
+ " <item label='Redo' action='redo'/>"
+ " </section>"
+ " <section></section>"
+ " <section label='Copy & Paste'>"
+ " <item label='Cut' action='cut'/>"
+ " <item label='Copy' action='copy'/>"
+ " <item label='Paste' action='paste'/>"
+ " </section>"
+ " <section>"
+ " <item label='Bold' action='bold'/>"
+ " <submenu label='Language'>"
+ " <item label='Latin' action='lang' target='latin'/>"
+ " <item label='Greek' action='lang' target='greek'/>"
+ " <item label='Urdu' action='lang' target='urdu'/>"
+ " </submenu>"
+ " </section>"
+ " </menu>"
+ "</interface>";
+
+ error = NULL;
+ builder = builder_new_from_string (buffer, -1, NULL);
+ g_assert (error == NULL);
+ obj = gtk_builder_get_object (builder, "window");
+ g_assert (GTK_IS_WINDOW (obj));
+ obj1 = gtk_builder_get_object (builder, "edit-menu");
+ g_assert (G_IS_MENU_MODEL (obj1));
+ g_object_unref (builder);
+}
+
int
main (int argc, char **argv)
{
g_test_add_func ("/Builder/Menus", test_menus);
g_test_add_func ("/Builder/MessageArea", test_message_area);
g_test_add_func ("/Builder/MessageDialog", test_message_dialog);
+ g_test_add_func ("/Builder/GMenu", test_gmenu);
return g_test_run();
}